/* ** por compatibilidad se omiten tildes **
================================================================================
 TRABAJO PRACTICO 3 - System Programming - ORGANIZACION DE COMPUTADOR II - FCEN
================================================================================
*/

#include "game.h"
#include "sched.h"


char campo_minado[CAMPO_SIZE][CAMPO_SIZE];

unsigned int posiciones_tanques[8];
unsigned int pagina_1;
unsigned int pagina_2;
unsigned int offset[8] = {0,0,0,0,0,0,0,0};
void inicializar_posiciones (void){


	int i;

	for (i = 0; i < 8; ++i)
	{
		posiciones_tanques[i] = 0x400000+(2*i*0x1000)+0x1000;		//posiciones_tanques[i] es la página 2 de la tarea
	}

	return;

}

void game_inicializar() {
	inicializar_posiciones();
}



/*modifique la aridad de la fucion; ahora tsi es el idice sobre todas las tareas*/
unsigned int game_mover(direccion d) {
	unsigned int id = tsi;
	id--; //ahora es el id de la tarea, pues tsi = 0 es la idle

	short i =  (posiciones_tanques[id] - 0x400000)/(0x1000*0x32);
	short j = ((posiciones_tanques[id] - 0x400000)/ 0x1000)% 0x32;
	switch(d){

		case NE:			
			i++;
			j--;
			break;
		case N:
			i++;
			break;
		case NO:	
			i++;
			j++;
			break;
		case E:
			j--; 
			break;	
		case C:
			break;
		case O:
			j++;
			break;
		case SE:
			i--;
			j--;
			break;	
		case S:
			i--;
			break;
		case SO:
			i--;
			j++;
			break;
		default:
			break;	 				
	}	


	i = i % 50;
	if (i < 0) i = 50 + i;
	j = j % 50;
	if (j < 0) j = 50 + j;

	posiciones_tanques[id] = 0x400000 + 0x32*i*0x1000 + j*0x1000;

//	breakpoint();
	mmu_mapear_pagina(0x8002000+offset[id]*0x1000, cr3s[id], posiciones_tanques[id],0);
	/*Aunque en la interfaz gráfica el recorrido se pinta mal en los bordes del mapa, el mapeo está bien hecho.*/
	if(id==0) escribir_numero(0x0000, i, j);		//pinta el recorrido del tanque 1
/*	if(id==1) escribir_numero(0x1000, i, j);		//pinta el recorrido del tanque 2
	if(id==2) escribir_numero(0x8000, i, j);		//pinta el recorrido del tanque 3
	if(id==3) escribir_numero(0x3000, i, j);		//pinta el recorrido del tanque 4
	if(id==4) escribir_numero(0x4000, i, j);		//pinta el recorrido del tanque 5
	if(id==5) escribir_numero(0x5000, i, j);		//pinta el recorrido del tanque 6
	if(id==6) escribir_numero(0x6000, i, j);		//pinta el recorrido del tanque 7
	if(id==7) escribir_numero(0x7000, i, j);		//pinta el recorrido del tanque 8
*/	offset[id]++;
    return posiciones_tanques[id];
}

unsigned int game_misil(int val_x, int val_y, unsigned int misil, unsigned int size) {
/*	unsigned int id = tsi;
	id--;
	unsigned char* src = (unsigned char*) misil;
	unsigned char* dst = (unsigned char*) posiciones_tanques[id] + 0x32*val_y*0x1000 + val_x*0x1000;
//	escribir_numero(0x2000,(unsigned int)0x32*val_y,(unsigned int)val_x);
	unsigned int i2;

	for(i2 = 0; i2 < size;i2++){
		dst[i2] = src[i2]; 
	}
	offset[id]++;
*/    return TRUE;
}

unsigned int game_minar(direccion d) {
	/*David me dijo que tenemos que crear una estructura (matriz de bool) que diga en que páginas hay una mina. La función game_mover debería chequear que no haya una mina antes de mapear la página. En caso que hubiera una mina, la tarea debe ser desalojada.*/
    return TRUE;
}



